\chapter{评估测试}
本章对\yaffsrecover 进行性能的评估和测试。

\section{测试环境}
本章的所有测试都运行于一台以下配置的计算机：
\begin{itemize}
\item CPU: Intel Core 2 Duo P8700 @ 2.53GHz (x2);
\item RAM: 4GB DDR3 1066;
\item HDD: 7200RPM;
\item Linux kernel: \texttt{3.3.4-3.i686.PAE}.
\end{itemize}

\section{测试方法}
\subsection{统计对象}
\paragraph*{指令数}
使用\texttt{callgrind}对除系统调用外的总指令数进行统计，记录\texttt{main}函数的积累总
指令数\footnote{一个函数的积累总指令数指该函数本身的指令数和其调用的所有函数的积累总指令数。}和\verb|file_recover_iterate_tree|函数的积累总指令数。

\paragraph*{执行时间}
使用\texttt{time}命令对程序运行时间进行计算，分别记录\texttt{system}（系统）和
\texttt{user}（用户）时间。

\subsection{测试数据}
本章的测试数据按如下方式生成：
\begin{enumerate}
\item 使用Linux NAND模拟器模拟一个大小为64MB、部署了空的YAFFS2文件系统的NAND设备并关闭该设备上的垃圾回收。
\item 利用编写好的写入方式写入一个包含给定chunk总数和header chunk总数的文件。
\item 使用NAND dump工具获得包含上面文件的NAND镜像
\end{enumerate}

共有两组测试数据，分别是：
\begin{itemize}
\item chunk总数固定为1500， header数分别为31，62，125，250，500，750；
\item header数固定为500，chunk总数分别为1000，1500，2000，2500，3000.
\end{itemize}

\section{测试结果}

\subsection{指令数}
\paragraph*{固定chunk总数，改变header数}
\begin{center}
\includegraphics[width=\textwidth]{img/ins_1500chunks.png}
\end{center}
\paragraph*{固定header数，改变chunk总数}
\begin{center}
\includegraphics[width=\textwidth]{img/ins_500hdrs.png}
\end{center}
\subsection{运行时间}
\paragraph*{固定chunk总数，改变header数}
\begin{center}
\includegraphics[width=\textwidth]{img/time_1500chunks.png}
\end{center}
\paragraph*{固定header数，改变chunk总数}
\begin{center}
\includegraphics[width=\textwidth]{img/time_500hdrs.png}
\end{center}

\section{结果分析}
从指令数的结果可以看出，同第三章对恢复算法的分析一致，在固定chunk总数时，指令数与header数成线
性关系；在固定header数时，指令数与chunk数成线性关系。同时，运行算法所消耗的CPU资源远大于初始化、文件输入输出消耗的CPU资源。

从运行时间的结果可以看出，I/O操作而非文件恢复算法才是时间瓶颈。而恢复一个12M大小的文件的500个
历史版本仅用时4.5秒（用户+系统）在实际情况下也是可以接受的。
